package me.helllp.book.jvm.ch03;

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.List;

/**
 * 测试分配对象的情况
 * VM参数：-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
 * 参数的含义：
 * 		在虚拟机发生内存回收时在输出设备显示信息，堆区域设置为20M并且不可扩展，新生代10M，E区占8份表示8/10，S1区1/10，S2区1/10
 * 
 * @author Administrator
 *
 */
public class AllocationGC {
	private static final int _1MB = 1024 * 1024;
	
	//	注意：这里的执行效果与回收器的不同而不同，所以在参数中指定了回收器类型
	public static void main(String[] args) {
		//	打印出使用的回收器
        List<GarbageCollectorMXBean> l = ManagementFactory.getGarbageCollectorMXBeans();  
        for(GarbageCollectorMXBean b : l) {  
            System.out.println(b.getName());  
        } 
        
		@SuppressWarnings("unused")
		byte[] allocation1 = null, allocation2 = null, allocation3 = null, allocation4 = null;
		
		allocation1 = new byte[2 *_1MB];
		allocation2 = new byte[2 *_1MB];
		allocation3 = new byte[2 *_1MB];
		
		//	进行4M对象分配的时候，E区空间不够，发生一次Minor GC
		allocation4 = new byte[4 *_1MB];
		//	依然不够分配，同时，占用了6M空间无法进入S区，通过分担担保进入老年区
		//	执行结果：allocation4 进入E区；S区空闲；老年代中allocation1，allocation2，allocation3
	}
}
